#pragma once
#include "../../abstract_picture.h"
#include "../../../dispatchable.h"
#include "../../itext.h"

class TFont;
class TPicText;

namespace Commands
{

namespace Core
{
    template <class T> class Command;
}

class SmartPicText : public AbstractPicture, public Commands::Dispatchable, public Commands::IText
{
public:
    SmartPicText(int x, int y, int layer, int id, TFont *font);

    virtual ~SmartPicText();

    void SetValue(const float value);

    void SetValue(const int value);

    void SetJustify(const Justify& justify);

    inline Justify GetJustify(void) const
    {
        return justify;
    }

    // -------- IGraphicElement -------------

    virtual float GetWidth(void) const;

    virtual float GetHeight(void) const;

    virtual void SetX(const float x);

    virtual void SetY(const float y);

    virtual void SetXY(const float x, const float y);

    virtual void SetAngle(const float angle);

    virtual void SetXScale(const float scale);

    virtual void SetYScale(const float scale);

    virtual void SetScale(const float scale);

    virtual void SetZOrder(const int order);

    virtual void SetFlip(const IGraphicElement::Flip flip);

    virtual void SetAlpha(const float alpha);

    virtual void Show(void);

    virtual void Hide(void);

    virtual void SetXAnchor(const float anchor) ;

    virtual void SetYAnchor(const float anchor) ;

    using Dispatchable::AddCommand;

    void AddCommand(const int queueId, const Core::Command<Commands::IGraphicElement>& command);

    void AddCommand(const int queueId, const Core::Command<Commands::IText>& command);

private:
    SmartPicText();
    TPicText* const text;
    Justify justify;
};
}
